# class Person:
#     def __init__(self, name, age):
#         self.name = name
#         self.age = age
#
#     def get_name(self):
#         print("执行获取")
#         return self.name
#
#     def set_name(self, name):
#         print("执行设置")
#         if 2 <= len(name) <= 4:
#             self.name = name
#         else:
#             print(f"名字不合法")
#
#     def del_name(self):
#         print(f"删除了name属性")
#
#     def get_age(self):
#         return self.age
#
#     def set_age(self, age):
#         if 0 <= age <= 100:
#             self.age = age
#         else:
#             print(f"年纪不合法")
#
#     def del_age(self):
#         print(f"删除了age属性")
#
#     # 当设置p_name 会使用set_name    获取p_name 会使用get_name
#     # p_name = property(fset=set_name, fget=get_name, fdel=del_name)
#     p_age = property(fset=set_age, fget=get_age, fdel=del_age)
#
#
# p = Person("张三", 20)
# # print(p.name, p.age)
#
# # 直接修改数据 导致数据赋值出现错误逻辑
# # 数据赋值 不安全
# # p.name = ""
# # p.age = -50
# # print(p.name, p.age)
#
#
# # 通过方法 来确保数据的安全
# # 可以解决数据的安全性  但是由直接使用属性编程了使用方法，麻烦
# # p.set_name("")
# # p.set_age(-50)
# # print(p.name, p.age)
# # p.set_name("张三三")
# # p.set_age(30)
# # print(p.name, p.age)
#
#
# # 使用属性封装
# # 设置 触发set_name
# p.p_name = "张三三"
# # 获取 触发get_name
# print(p.p_name)
#
# p.p_name = ""
# print(p.p_name)
#
# p.p_age = -10
# print(p.p_age)
# p.p_age = 50
# print(p.p_age)
#
# del p.p_name
# del p.p_age


# 最终使用装饰器完成

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    @property
    def p_name(self):
        return self.name

    @p_name.setter
    def p_name(self, name):
        if 2 <= len(name) <= 4:
            self.name = name
        else:
            print(f"长度不合法")

    @property
    def p_age(self):
        return self.age

    @p_age.setter
    def p_age(self, age):
        self.age = age



p = Person("张三", 20)

p.p_name = "李四"
print(p.p_name)

p.p_age = 30
print(p.p_age)


